package com.example.mysql.学习笔记.高级.入门.逻辑架构.sql执行流程;

/**
 * 1.语法检查:检查SQL拼写是否正确，如果不正确，Oracle 会报语法错误。
 * 2.语义检查:检查SQL中的访问对象是否存在。比如我们在写SELECT语句的时候，列名写错了，系统就会提示
 * 错误。语法检查和语义检查的作用是保证SQL语句没有错误。
 * 3.权限检查:看用户是否具备访问该数据的权限。
 * 4.共享池检查:共享池(Shared Pool)是一块内存池，最主要的作用是缓存SQL语句和该语句的执行计划。
 *   Oracle通过检查共享池是否存在SQL语句的执行计划，来判断进行软解析，还是硬解析。那软解析和硬解析又该
 *   怎么理解呢?
 *   在共享池中，Oracle 首先对SQL语句进行Hash运算，然后根据Hash值在库缓存(Library Cache)中查找，如
 *   果存在SQL语句的执行计划，就直接拿来执行，直接进入“执行器”的环节，这就是软解析。
 *   如果没有找到SQL语句和执行计划，Oracle 就需要创建解析树进行解析，生成执行计划，进入“优化器”这个步
 *   骤，这就是硬解析。
 *     5.优化器:优化器中就是要进行硬解析，也就是决定怎么做，比如创建解析树，生成执行计划。
 *     6.执行器:当有了解析树和执行计划之后，就知道了SQL 该怎么被执行，这样就可以在执行器中执行语句了。
 *   共享池是Oracle中的术语，包括了库缓存，数据字典缓冲区等。我们上面已经讲到了库缓存区，它主要缓存SQL
 *   语句和执行计划。而数据字典缓冲区存储的是Oracle中的对象定义，比如表、视图、索引等对象。当对SQL语句
 *   进行解析的时候，如果需要相关的数据，会从数据字典缓冲区中提取。
 *   库缓存这一个步骤,决定了SQL语句是否需要进行硬解析。为了提升SQL的执行效率,我们应该尽量避免硬解
 *   析，因为在SQL的执行过程中，创建解析树，生成执行计划是很消耗资源的。
 *   你可能会问，如何避免硬解析，尽量使用软解析呢?在Oracle中，绑定变量是它的一-大特色。绑定变量就是在
 *   SQL语句中使用变量,通过不同的变量取值来改变SQL的执行结果。这样做的好处是能提升软解析的可能性，不
 *   足之处在于可能会导致生成的执行计划不够优化，因此是否需要绑定变量还需要视情况而定。
 *   举个例子，我们可以使用下面的查询语句:
 *   SQL> select * from player where player_id = 10001;
 *   你也可以使用绑定变量，如: .
 *   SQL> select * from player where player_id = :player_id;
 *   这两个查询语句的效率在Oracle中是完全不同的。如果你在查询player_ id= 10001之后，还会查询10002、10003
 *   之类的数据，那么每一-次查询都会创建一个新的查询解析。而第二种方式使用了绑定变量,那么在第一-次查询之
 *   后，在共享池中就会存在这类查询的执行计划，也就是软解析。
 *   因此，我们可以通过使用绑定变量来减少硬解析,减少Oracle的解析工作量。但是这种方式也有缺点，使用动态
 *   SQL的方式，因为参数不同，会导致SQL的执行效率不同，同时SQL优化也会比较困难。
 *
 *
 */
public class oracle的sql执行顺序 {
}
